<?php
class service extends common{
	
	function validate_user($data){
		if($data['openid']==''){
			$code = '41009';
		}else{
			$user = $this->getInfo("api_user where id='".$data['openid']."'");
			
			if($user['id']==''){
				$code = '40003';
			}else{
				if((time()-$data['timesnamp'])>100){
					$code = '42001';
				}else{
					$sign = $this->create_sign($data, $user['token']);
					if($sign!=$data['sign']){
						$code = '40002';
					}else{
						$code = '0';
					}
				}
			}
		}
		//$this->log($data);
		return $code;
	}
	
	function create_sign($data,$token){
		ksort($data);
		$str = '';
		if(is_array($data)){
			foreach($data as $k=>$v){
				if($k!='openid' && $k!='sign' && $k!='param') $str.=$v;
			}
		}
		$sign = md5(md5($str.$token));
		return $sign;
	}

	function result($data='',$code='0'){
		if(!is_array($data)) $data = array('result'=>$data);
		if($data['error']=='') $data['error'] = $code;
		if($data['msg']=='') $data['msg'] = $this->codetomsg($code);
		
		return $this->JSON($data);
	}
	
	function log($data){
		$open = fopen('api.log',"a+");
		
		$str = var_export($data,true);
		
		fwrite($open,date("Y-m-d H:i:s")."\r\n".$str."\r\n\r\n");
		fclose($open);
	}
	
	/**************************************************************
	 *
	 *  使用特定function对数组中所有元素做处理
	 *  @param  string  &$array     要处理的字符串
	 *  @param  string  $function   要执行的函数
	 *  @return boolean $apply_to_keys_also     是否也应用到key上
	 *  @access public
	 *
	 *************************************************************/
	function arrayRecursive(&$array, $function, $apply_to_keys_also = false){
		static $recursive_counter = 0;
		if (++$recursive_counter > 1000) {
			die('possible deep recursion attack');
		}
		if(is_array($array)){
			foreach ($array as $key => $value) {
				if (is_array($value)) {
					$this->arrayRecursive($array[$key], $function, $apply_to_keys_also);
				} else {
					$array[$key] = $function($value);
				}
				 
				if ($apply_to_keys_also && is_string($key)) {
					$new_key = $function($key);
					if ($new_key != $key) {
						$array[$new_key] = $array[$key];
						unset($array[$key]);
					}
				}
			}
		}
		$recursive_counter--;
	}
	 
	/**************************************************************
	 *
	 *  将数组转换为JSON字符串（兼容中文）
	 *  @param  array   $array      要转换的数组
	 *  @return string      转换得到的json字符串
	 *  @access public
	 *
	 *************************************************************/
	function JSON($array) {
		$this->arrayRecursive($array, 'urlencode', true);
		$json = json_encode($array);
		return urldecode($json);
	}

	function codetomsg($code){
		$codes = array(
				'-1'=>'系统繁忙，此时请开发者稍候再试',
				'0'=>'请求成功',
				'40001'=>'获取access_token时AppSecret错误，或者access_token无效。请开发者认真比对AppSecret的正确性，或查看是否正在为恰当的公众号调用接口',
				'40002'=>'不合法的凭证类型',
				'40003'=>'不合法的OpenID，请开发者确认OpenID（该用户）是否已关注公众号，或是否是其他公众号的OpenID',
				'40004'=>'不合法的媒体文件类型',
				'40005'=>'不合法的文件类型',
				'40006'=>'不合法的文件大小',
				'40007'=>'不合法的媒体文件id',
				'40008'=>'不合法的消息类型',
				'40009'=>'不合法的图片文件大小',
				'40010'=>'不合法的语音文件大小',
				'40011'=>'不合法的视频文件大小',
				'40012'=>'不合法的缩略图文件大小',
				'40013'=>'不合法的AppID，请开发者检查AppID的正确性，避免异常字符，注意大小写',
				'40014'=>'不合法的access_token，请开发者认真比对access_token的有效性（如是否过期），或查看是否正在为恰当的公众号调用接口',
				'40015'=>'不合法的菜单类型',
				'40016'=>'不合法的按钮个数',
				'40017'=>'不合法的按钮个数',
				'40018'=>'不合法的按钮名字长度',
				'40019'=>'不合法的按钮KEY长度',
				'40020'=>'不合法的按钮URL长度',
				'40021'=>'不合法的菜单版本号',
				'40022'=>'不合法的子菜单级数',
				'40023'=>'不合法的子菜单按钮个数',
				'40024'=>'不合法的子菜单按钮类型',
				'40025'=>'不合法的子菜单按钮名字长度',
				'40026'=>'不合法的子菜单按钮KEY长度',
				'40027'=>'不合法的子菜单按钮URL长度',
				'40028'=>'不合法的自定义菜单使用用户',
				'40029'=>'不合法的oauth_code',
				'40030'=>'不合法的refresh_token',
				'40031'=>'不合法的openid列表',
				'40032'=>'不合法的openid列表长度',
				'40033'=>'不合法的请求字符，不能包含\uxxxx格式的字符',
				'40035'=>'不合法的参数',
				'40038'=>'不合法的请求格式',
				'40039'=>'不合法的URL长度',
				'40050'=>'不合法的分组id',
				'40051'=>'分组名字不合法',
				'40117'=>'分组名字不合法',
				'40118'=>'media_id大小不合法',
				'40119'=>'button类型错误',
				'40120'=>'button类型错误',
				'40121'=>'不合法的media_id类型',
				'40132'=>'微信号不合法',
				'41001'=>'缺少access_token参数',
				'41002'=>'缺少appid参数',
				'41003'=>'缺少refresh_token参数',
				'41004'=>'缺少secret参数',
				'41005'=>'缺少多媒体文件数据',
				'41006'=>'缺少media_id参数',
				'41007'=>'缺少子菜单数据',
				'41008'=>'缺少oauth code',
				'41009'=>'缺少openid',
				'42001'=>'access_token超时，请检查access_token的有效期，请参考基础支持-获取access_token中，对access_token的详细机制说明',
				'42002'=>'refresh_token超时',
				'42003'=>'oauth_code超时',
				'43001'=>'需要GET请求',
				'43002'=>'需要POST请求',
				'43003'=>'需要HTTPS请求',
				'43004'=>'需要接收者关注',
				'43005'=>'需要好友关系',
				'44001'=>'多媒体文件为空',
				'44002'=>'POST的数据包为空',
				'44003'=>'图文消息内容为空',
				'44004'=>'文本消息内容为空',
				'45001'=>'多媒体文件大小超过限制',
				'45002'=>'消息内容超过限制',
				'45003'=>'标题字段超过限制',
				'45004'=>'描述字段超过限制',
				'45005'=>'链接字段超过限制',
				'45006'=>'图片链接字段超过限制',
				'45007'=>'语音播放时间超过限制',
				'45008'=>'图文消息超过限制',
				'45009'=>'接口调用超过限制',
				'45010'=>'创建菜单个数超过限制',
				'45015'=>'回复时间超过限制',
				'45016'=>'系统分组，不允许修改',
				'45017'=>'分组名字过长',
				'45018'=>'分组数量超过上限',
				'46001'=>'不存在媒体数据',
				'46002'=>'不存在的菜单版本',
				'46003'=>'不存在的菜单数据',
				'46004'=>'不存在的用户',
				'47001'=>'解析JSON/XML内容错误',
				'48001'=>'api功能未授权，请确认公众号已获得该接口，可以在公众平台官网-开发者中心页中查看接口权限',
				'50001'=>'用户未授权该api',
				'50002'=>'用户受限，可能是违规后接口被封禁',
				'61451'=>'参数错误(invalid parameter)',
				'61452'=>'无效客服账号(invalid kf_account)',
				'61453'=>'客服帐号已存在(kf_account exsited)',
				'61454'=>'客服帐号名长度超过限制(仅允许10个英文字符，不包括@及@后的公众号的微信号)(invalid kf_acount length)',
				'61455'=>'客服帐号名包含非法字符(仅允许英文+数字)(illegal character in kf_account)',
				'61456'=>'客服帐号个数超过限制(10个客服账号)(kf_account count exceeded)',
				'61457'=>'无效头像文件类型(invalid file type)',
				'61450'=>'系统错误(system error)',
				'61500'=>'日期格式错误',
				'61501'=>'日期范围错误',
				'9001001'=>'POST数据参数不合法',
				'9001002'=>'远端服务不可用',
				'9001003'=>'Ticket不合法',
				'9001004'=>'获取摇周边用户信息失败',
				'9001005'=>'获取商户信息失败',
				'9001006'=>'获取OpenID失败',
				'9001007'=>'上传文件缺失',
				'9001008'=>'上传素材的文件类型不合法',
				'9001009'=>'上传素材的文件尺寸不合法',
				'9001010'=>'上传失败',
				'9001020'=>'帐号不合法',
				'9001021'=>'已有设备激活率低于50%，不能新增设备',
				'9001022'=>'设备申请数不合法，必须为大于0的数字',
				'9001023'=>'已存在审核中的设备ID申请',
				'9001024'=>'一次查询设备ID数量不能超过50',
				'9001025'=>'设备ID不合法',
				'9001026'=>'页面ID不合法',
				'9001027'=>'页面参数不合法',
				'9001028'=>'一次删除页面ID数量不能超过10',
				'9001029'=>'页面已应用在设备中，请先解除应用关系再删除',
				'9001030'=>'一次查询页面ID数量不能超过50',
				'9001031'=>'时间区间不合法',
				'9001032'=>'保存设备与页面的绑定关系参数错误',
				'9001033'=>'门店ID不合法',
				'9001034'=>'设备备注信息过长',
				'9001035'=>'设备申请参数不合法',
				'9001036'=>'查询起始值begin不合法',
		);
		return $codes[$code];
	}
}
?>